package com.xjh.basestudy.designmode.behaviorMode.behaviorMode8_Command.p2_command;

import com.xjh.basestudy.designmode.behaviorMode.behaviorMode8_Command.p1_origin.Bulb;

/**
 * @Author XuJianHua
 * @Date 2022/10/5 20:12
 * @Description
 *
 * 闪烁命令类FlashCommand实现了命令接口，与之前的开关命令相比，其执行方法exe()与反向执行方法unexe()的实现大相径庭。可以看到从第12行开始，
 * 我们在一番状态逻辑校验后便启动了霓虹灯闪烁线程，其间反复地触发灯泡的开关操作以使其不断闪烁，直到第31行的反向执行方法被调用为止。
 * 此处的代码逻辑不是重点，读者更需要关注的是这个闪烁命令同样符合命令接口Command的标准，如此才能保证良好的系统兼容性，并成功植入开关控制器芯片（命令请求方）完成事件与命令的绑定。最后我们来验证一下可行性

 */
public class FlashCommand implements Command {

   private Bulb bulb;
   private volatile boolean neonRun = false;// 闪烁命令运行状态

   public FlashCommand(Bulb bulb) {
      this.bulb = bulb;
   }

   @Override
   public void exe() {
      if (!neonRun) {// 非命令运行时才能启动闪烁线程
         neonRun = true;
         System.out.println("霓虹灯闪烁任务启动");
         new Thread(() -> {
            try {
               while (neonRun) {
                  bulb.on();// 执行开灯操作
                  Thread.sleep(500);
                  bulb.off();// 执行关灯操作
                  Thread.sleep(500);
               }
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }).start();
      }
   }

   @Override
   public void unexe() {
      neonRun = false;
      System.out.println("霓虹灯闪烁任务结束");
   }

}